/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package station;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.MulticastSocket;

/**
 *
 * @author safe
 */
public class Sender extends Thread {

    public static final int SLOT_DAUER_MILLIS = 40;
    public static final int SENDE_PUFFER = 5;
    private final MulticastSocket multicastSocket;

    public Sender(MulticastSocket multicastSocket) {
        this.multicastSocket = multicastSocket;
    }

    private String extractMessageStationInfo(byte[] message) {
        byte[] stationInfo = new byte[10];
        System.arraycopy(message, 0, stationInfo, 0, 10);
        return new String(stationInfo);
    }

    /*
     *Nachricht aus Datenstruktur nehmen
     *Timestamp machen und rausschicken
     */
    @Override
    public void run() {
        try {
            int currentSendingSlot = DataSlotBelegung.getOurCurrentSlot();

            long millisBisZumSenden = (currentSendingSlot * SLOT_DAUER_MILLIS) + SENDE_PUFFER;
            wartenAufSendeZeitInnerhalbMeinesFrames(millisBisZumSenden);

            // hier jetzt den slot berechnen den wir als reserviert ansehen wollen und in die Nachricht stecken
            DataSlotBelegung.calculateNextFreeSlot();
            int nextSendingSlot = DataSlotBelegung.getOurNextSlot();

            // nachricht mit aktuell gewähltem slot und message timestamp
            DataNaechsteNachricht.setSlot(nextSendingSlot);
            long sendingTime = DataNaechsteNachricht.setMessageTimestamp();


            DatagramPacket data = DataNaechsteNachricht.getNextMessage();

            int slotByActualTime = DataEmpfangeneNachrichten.getSlotNumber(System.currentTimeMillis() + DataAbweichungsZeit.getAbWeichungsZeit());
           
            if (slotByActualTime == currentSendingSlot) {
                multicastSocket.send(data);
            } else {
             //   System.out.println("|||||" + DataEmpfangeneNachrichten.getOurStationName() + " hatSlot: " + currentSendingSlot + " verpasst. Jetzt "  + slotByActualTime);
                DataSlotBelegung.disableNextSlot();
            }



//            if (DataEmpfangeneNachrichten.collisionDetect(sendingTime)) {
//                if (!DataEmpfangeneNachrichten.collisionWithUs(extractMessageStationInfo(data.getData()))) {
//                    DataEmpfangeneNachrichten.setSendingCollision(true);
//                }
//            }

        } catch (IOException ex) {
            System.out.println("IOException beim Sender: " + ex.getMessage());
        } catch (InterruptedException ex) {
            System.out.println("InterruptedException beim Sender: " + ex.getMessage());
        }

    }

    private void wartenAufSendeZeitInnerhalbMeinesFrames(long millisBisZumSenden) throws InterruptedException {
        if (millisBisZumSenden >= 0) {
            sleep(millisBisZumSenden);
        }
    }
}
